/**
 * @Logger.as.as
 *
 * @author sodaChen mail:asframe#163.com
 * @version 1.0
 * <br>Copyright (C), 2010 asFrame.com
 * <br>This program is protected by copyright laws.
 * <br>Program Name:ASFrame
 * <br>Date:2011-8-12
 */
package com.asframe.log
{
	import com.asframe.utils.ClassUtils;

	/**
	 * Log使用对象,最主要和最基础的使用对象，一般情况下都是使用这个来进行日志的输入和输出。
	 * 带有默认的输出渠道，实际项目使用者。可以动态修改日志的输出格式
	 * @author sodaChen
	 * Date:2011-8-12
	 */
	public class Log
	{
		public static var isOpenLog						:Boolean = true;
		/** 默认是开启调试模式的 **/
		private static var level							:Level = Level.TRACE;
		/** 日志输出控制台接口，一般由各种子类实现 **/
		public static var logConsole						:ILogConsole;

//		/**
//		 * 是否开启普通输出模式
//		 * @return
//		 *
//		 */
//		public static function isTraceEnabled():Boolean
//		{
//			return level.level >= Level.TRACE.level;
//		}
		/**
		 * 是否开启调试输出
		 * @return
		 *
		 */
		public static function isDebugEnabled():Boolean
		{
			return level.level >= Level.DEBUG.level;
		}
//		/**
//		 * 是否开启信息输出
//		 * @return
//		 *
//		 */
//		public static function isInfoEnabled():Boolean
//		{
//			return level.level >= Level.INFO.level;
//		}
//		/**
//		 * 是否开启警告信息输出
//		 * @return
//		 *
//		 */
//		public static function isWarnEnabled():Boolean
//		{
//			return level.level >= Level.WARN.level;
//		}
		public static function print(target:Object,...logs):void
		{
			formatLog(Level.TRACE,target,logs);
		}
		/**
		 * 输出调试信息
		 * @param target:日志输出的源头
		 * @param arg0:输出参数
		 * @param arg1:输出参数
		 * @param arg2:输出参数
		 *
		 */
		public static function debug(target:Object,...logs):void
		{
			formatLog(Level.DEBUG,target,logs);
		}
		/**
		 * 输出提示信息
		 * @param msg
		 *
		 */
		public static function info(target:Object,...logs):void
		{
			formatLog(Level.INFO,target,logs);
		}
		/**
		 * 输出警告的信息
		 * @param target:日志输出的源头
		 * @param arg0:输出参数
		 * @param arg1:输出参数
		 * @param arg2:输出参数
		 *
		 */
		public static function warn(target:Object,...logs):void
		{
			formatLog(Level.WARN,target,logs);
		}

		/**
		 * 输出错误的信息
		 * @param	msg:需要输出信息的对象
		 */
		public static function error(target:Object,...logs):void
		{
			formatLog(Level.ERROR,target,logs);
		}
		private static function formatLog(logLevel:Level,target:Object,logs:Array):void
		{
			//表示没有初始化日志
			if(logConsole == null)
			{
				var msg:String = "【Log系统没初始化】[" + ClassUtils.getFullyNameByObj(target,true) + "]";
				for (var i:int = 0; i < logs.length; i++)
				{
					msg += logs[i];
				}
				trace(msg);
				return ;
			}
			//当前等级小于或者等于日志输出等级
			if(isOpenLog && level.level <= logLevel.level)
			{
				logConsole.console(logLevel,target,logs);
			}
		}
		/**
		 * 设置日志等级
		 * @param level:日志等级描述对象
		 *
		 */
		public static function setLevel(level:Level):void
		{
			Log.level = level;
		}
	}
}
